# 在出现异常时,最后一行信息中 冒号之前是异常类型,冒号之后是异常描述信息
# NameError: name 'a' is not defined
# NameError: 冒号之前是异常类型
# : name 'a' is not defined 冒号之后是异常描述信息
# print(a)

# 获取指定类型异常的方法

"""
try:
    可能出现异常的代码
except 异常类型1:
    出现异常类型1时执行的代码
except 异常类型2:
    出现异常类型2时执行的代码
......

如果出现的异常不是我们指定的类型中的其中一个,则异常依然会造成程序终止
"""

# 下方代码只能捕获NameError 如果出现TypeError则结束程序
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

# try:
#     print(1 + '2')  # TypeError
#     print(a)  # NameError
# except NameError:
#     print('此处出现了变量未定义错误.')

# 如果我想捕获多种类型的异常应该怎么做呢?
# 方法一: 书写多个except 在后方分别填写异常类型
try:
    print([1, 2, 3][100])
    print(1 / 0)  # ZeroDivisionError
    print(a)  # NameError
    print(1 + '2')  # TypeError
except NameError:
    print('此处出现了变量未定义错误.')
except TypeError:
    print('此处出现了类型不一致错误.')
# 在开发中,我们不可能记得每一种异常类型的名称,此时我们可以使用Exception接收任意类型的异常
except Exception:
    print('此处出现了未知异常,但是任何异常类型都可以被Exception接收.')

print('----------------------------')


# 方法二: 书写一个except 在后方填写多个异常类
try:
    print(1 + '2')  # TypeError
    print(a)  # NameError
    print(1 / 0)  # ZeroDivisionError
except (NameError, TypeError):
    print('出现了变量未定义或者类型不一致错误')
except Exception:
    print('此处出现了未知异常,但是任何异常类型都可以被Exception接收.')

# 思考: 在一个程序中,可能既出现了NameError 又出现了TypeError么?
# 绝不可能, 出现了一个异常,就退出程序了,不会执行到第二个异常的


